-- back_floor
-- created by panyl
-- 退回前（魔力*1.0/10）层（最少1层，最多10层；50层、100层大奖不重复出现）

-- 计算回退层数
function calcBackFloor(source, skillId, para)
    if #para == 2 and type(para[1]) == "number" then
        if para[2] == 1 then
            -- 返回固定层数
            return para[1];
        elseif para[2] == 2 then
            -- 冈布奥专属技能
            local id = SlimeSkillM.getSlimeActiveSkillId(skillId);
            local level = SlimeSkillM.getSkillLevel(id);
            local vforce = para[1] + level;
            return vforce;
        end
    end

    -- 1. 威力
    local base = 1000;
    local floor = DungeonM.currentLayer();

    -- 计算魔法效果加成
    local addon_rate = SkillM.calcMagicEffectAddon(source, skillId, false);
    -- 最终威力
    local force = math.modf(base * (addon_rate + 1000)/1000);
    -- 2. 施展方的魔力
    local magic = source:getMagic();

    -- 往前退的层数
    local vbase = 1 + math.modf(para[1] * (1000 * magic + (magic + 50) * (base - 1000)) / base / (magic + 50));
    local vforce = 1 + math.modf(para[1] * (1000 * magic + (magic + 50) * (force - 1000)) / force / (magic + 50));

    -- 大地之门回退层数+
    prop = PropM.combine(source, "earth_floor", skillId);
    vforce = PropM.apply(prop, vforce);

    -- 退回到的层
    local floorForce = math.max(1, floor - vforce);

    vforce = floor - floorForce;

    return vforce;
end

return {
    apply = function(source, target, skillId, round, para, extra)
        -- 先赋一个无敌状态
        local propId = PropM.getPropId("invincible");
        PropM.record(source, { propId, 1, 1, round + 2, }, "mixed");

        -- TODO: 这里不做任何操作，在DungeonM.addAction中处理

        -- 抛出事件
        EventMgr.fire(event.BACK_FLOOR, {["back_floor"] = calcBackFloor(source, skillId, para), ["skill_id"] = skillId, });

        -- 返回作用目标
        return { source, };
    end,

    check = function(skillId)

        -- 第一层不能施放
        if DungeonM.currentLayer() <= 1 then
            return "forbid_floor";
        end

        -- 副本中不能使用
        if DungeonInstanceM.isInInstance() then
            return "forbid_floor";
        end

        -- boss层不能使用
        if DungeonBossM.isBossLayer(DungeonM.getDungeonId(), DungeonM.currentLayer()) then
            return "forbid_floor";
        end

        -- 夹层迷宫
        if UnrealDungeonM.isInUnreal() then
            return "forbid_floor";
        end

        return true;
    end,

    parse = function(desc)
        local arr = string.explode(desc, ",");
        if #arr == 1 then
            return { tonumber(arr[1]), };
        else
            return { tonumber(arr[1]), tonumber(arr[2]), }
        end
    end,

    -- 解析技能描述
    parseDesc = function(source, skillId, desc, para)
        if not desc then
            return;
        end

        if #para == 2 and type(para[1]) == "number" then
            if para[2] == 2 then
                -- 冈布奥专属技能
                local id = SlimeSkillM.getSlimeActiveSkillId(skillId);
                local level = SlimeSkillM.getSkillLevel(id);
                local vforce = para[1] + level;
                local desc = string.gsub(desc, "{back_floor}", vforce);
                return desc;
            end
        end

        desc = string.gsub(desc, "{back_floor}", calcBackFloor(source, skillId, para));

        return desc;
    end,
};
